#ifndef CLIENTPOLLING_H_
#define CLIENTPOLLING_H_
#include "../SocketsAndThreads/thread.h"
#include "../SocketsAndThreads/socket.h"
#include "../SocketsAndThreads/mutex.h"
#include "../Utils/directoryHandler.h"
#include "../Utils/index.h"
#include "../messages/put_file.h"
#include "../messages/delete.h"
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <time.h>
#include "../Utils/md5.h"
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/SimpleLayout.hh>
extern log4cpp::Category& category;

class ClientPolling: public Thread {


typedef std::map<std::string, std::string> MapFiles;
typedef std::vector<std::string> NamesFiles;

public:

	/*Constructor:
	 * s: socket por el cual esta conectado al server
	 * m: mutex para proteger recursos
	 * time_interval: tiempo de intervalo de polling
	 * index_path: path de donde esta almacenado el indice de archivos del repositorio
	 * storage_path: path del repositorio
	 * user: nombre de usuario del cliente
	 * pass: contraseña del cliente
	 */
	ClientPolling(Socket *s, Mutex* m, int time_interval, std::string& index_path, std::string& storage_path,std::string user,std::string pass);

	/*Envia novedades al server*/
	void send_news(MapFiles& news);

	/*Borra archivos que ya no existen mas y se lo comunica al server*/
	void delete_olds(NamesFiles& old_to_delete);

	/* Hace un scaneo general de los archivos, y los pone como novedades, como para borrar o simplemente
	 * no hace nada cuando los archivos no cambiaron*/
	std::pair<MapFiles,NamesFiles> process(NamesFiles& file_names);

	/* Callback que 'pollea' cada un determinado tiempo al repositorio */
	void run();

	/*Destructor*/
	virtual ~ClientPolling();

private:
	Socket* sock;
	Mutex* m;
	std::string storage_path;
	int time_interval;
	std::string index_path;
	std::string user;
	std::string pass;
};

#endif /* CLIENTPOLLING_H_ */
